AWS WAF で特定のCookieの値で制限するレートベースルールを作成する

AWS WAF で特定のCookieの値で制限するレートベースルールを作成する

Clock Icon2024.09.20

アノテーション株式会社のあのふじたです。
最近AWS WAFに特定のCookieの値で制限するレートベースルールを構成する機会があったのでブログ化してみます。

AWS WAF でレートベースルール を構成すると

AWS WAF でレートベースルールを構成し特定の宛先からの一定期間で連続したリクエストを受信すると、その宛先をブロックすることが出来ます。

レートベースのルールといえばIPアドレスが一般的ですが、AWS WAFは様々なアップデートがされており、様々な条件で制限することができるようになっています。
ここ最近のアップデートです。

やってみる

今回設定するルール

Cookieの特定のKeyのアクセスでレートリミットに達した後にブロックするルールを作成する

事前に ALB-EC2(nginx) の環境を作成し、通常のアクセスであれば 200 の応答が返ってくるように設定しておきます

$ curl -I waf-test-alb-xxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com
HTTP/1.1 200 OK
Date: Thu, 39 Sep 2024 23:59:59 GMT
Content-Type: text/html
Content-Length: 615
Connection: keep-alive
Server: nginx/1.22.1
Last-Modified: Fri, 39 Sep 2024 23:59:59 GMT
ETag: "652947a3-267"
Accept-Ranges: bytes
Cf-Team: 22aa42e6b30000e07e11190400000001

ルール設定

今回は Web ACLs (Asia Pacific(Tokyo)) に直接ルールを追加する手順とします。

  • Create web ACL をクリック
    waf-acl-cookie-006
  1. Describe web ACL and associate it to AWS resources
    • Web ACL details
      • Regional resources(今回はALBなので)
      • Region: Asia Pacific(Tokyo)
      • Name: 任意の名前(test-cookie-ratebase-acl)
    • Associated AWS resources
      • 任意のAWSリソースを選択(今回はALB)
    • Next
      waf-acl-cookie-007
  2. Add my own rules and rule group をクリック
    waf-acl-cookie-008
  3. Rule builder
    • Rule
      • Name: 任意の名前(test-cookie-ratebase-rule)
      • Type: Rate-based rule
      • Rate-limiting criteria
        • Rate limit: 今回は50
        • Evaluation window: 1, 2, 5, 10min のどれかを選択(今回は1min)
        • Request aggregation: Custom keys
      • Request aggregation key
        • Cookie
        • Cookie name: チェックしたいCookieのKEY名: (test_token)
        • Text transformation: None
      • Scope of inspection and rate limiting
        • Consider all requests
      • Then
        • Action: 任意のアクションを選択(今回は Block)
      • Add rule をクリック

waf-acl-cookie-010

waf-acl-cookie-003

waf-acl-cookie-004

waf-acl-cookie-005

  1. Add rules and rule groupNext をクリック
    waf-acl-cookie-009
  2. Set rule priority 一つしかルールがないので Next クリック
  3. Configure metrics 今回は変更せずに Next クリック
  4. Review and create web ACL 全体を確認後に Create web ACL をクリック

実際にアクセスし検証する

特定のCookieの Key 及び Value(test_token=hogehoge) アクセス でレートリミット(50/1min)に達した後にブロックされることを確認します
0.5 秒ごとにCookieの Key 及び Value(test_token=hogehoge) で100回アクセスしてみます。

$ for i in {1..100}; do echo -n "$(date '+%Y/%m/%d %H:%M:%S') ${i}回目:"; curl -s -b "test_token=hogehoge" "http://waf-test-alb-xxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com" -o /dev/null -w "%{http_code}\n"; sleep 0.5;done
2024/xx/xx 16:27:22 1回目:200
2024/xx/xx 16:27:23 2回目:200
...
...
2024/xx/xx 16:27:52 49回目:200
2024/xx/xx 16:27:53 50回目:200
2024/xx/xx 16:27:53 51回目:200
2024/xx/xx 16:27:54 52回目:200
2024/xx/xx 16:27:55 53回目:200
2024/xx/xx 16:27:55 54回目:200
2024/xx/xx 16:27:56 55回目:200
2024/xx/xx 16:27:56 56回目:200
2024/xx/xx 16:27:57 57回目:200
2024/xx/xx 16:27:58 58回目:200
2024/xx/xx 16:27:58 59回目:200
2024/xx/xx 16:27:59 60回目:200
2024/xx/xx 16:27:59 61回目:200
2024/xx/xx 16:28:00 62回目:200
2024/xx/xx 16:28:01 63回目:200
2024/xx/xx 16:28:01 64回目:200
2024/xx/xx 16:28:02 65回目:200
2024/xx/xx 16:28:03 66回目:200
2024/xx/xx 16:28:03 67回目:200
2024/xx/xx 16:28:04 68回目:200
2024/xx/xx 16:28:04 69回目:200
2024/xx/xx 16:28:05 70回目:200
2024/xx/xx 16:28:06 71回目:200
2024/xx/xx 16:28:06 72回目:200
2024/xx/xx 16:28:07 73回目:200
2024/xx/xx 16:28:07 74回目:200
2024/xx/xx 16:28:08 75回目:403
2024/xx/xx 16:28:09 76回目:403
...
...
2024/xx/xx 16:28:22 99回目:403
2024/xx/xx 16:28:23 100回目:403

75回目でブロックされました

レートベースルール制限事項
https://docs.aws.amazon.com/waf/latest/developerguide/waf-rule-statement-type-rate-based-caveats.html

  • 制限と完全に一致するとは限らない(近い値にはなる)
  • 評価には 30 秒未満の遅延が発生する

に該当する遅延なので問題ないかとは思います。

別の Value(test_token=hugehuge) でアクセスしてみます。

$ for i in {1..100}; do echo -n "$(date '+%Y/%m/%d %H:%M:%S') ${i}回目:"; curl -s -b "test_token=hugahuga" "http://waf-test-alb-xxxxxxxxxxxx.ap-northeast-1.elb.amazonaws.com" -o /dev/null -w "%{http_code}\n"; sleep 0.5;done
2024/xx/xx 16:30:26 1回目:200
2024/xx/xx 16:30:27 2回目:200
...
...
2024/xx/xx 16:30:57 49回目:200
2024/xx/xx 16:30:57 50回目:200
2024/xx/xx 16:30:58 51回目:200
2024/xx/xx 16:30:59 52回目:200
2024/xx/xx 16:30:59 53回目:200
2024/xx/xx 16:31:00 54回目:200
2024/xx/xx 16:31:00 55回目:200
2024/xx/xx 16:31:01 56回目:200
2024/xx/xx 16:31:02 57回目:200
2024/xx/xx 16:31:02 58回目:200
2024/xx/xx 16:31:03 59回目:200
2024/xx/xx 16:31:04 60回目:200
2024/xx/xx 16:31:04 61回目:200
2024/xx/xx 16:31:05 62回目:200
2024/xx/xx 16:31:05 63回目:200
2024/xx/xx 16:31:06 64回目:200
2024/xx/xx 16:31:07 65回目:200
2024/xx/xx 16:31:07 66回目:200
2024/xx/xx 16:31:08 67回目:200
2024/xx/xx 16:31:09 68回目:200
2024/xx/xx 16:31:09 69回目:200
2024/xx/xx 16:31:10 70回目:200
2024/xx/xx 16:31:10 71回目:200
2024/xx/xx 16:31:11 72回目:200
2024/xx/xx 16:31:12 73回目:200
2024/xx/xx 16:31:12 74回目:200
2024/xx/xx 16:31:13 75回目:403
2024/xx/xx 16:31:13 76回目:403
2024/xx/xx 16:31:14 77回目:403
...
...
2024/xx/xx 16:31:28 99回目:403
2024/xx/xx 16:31:29 100回目:403

こちらも75回目でブロックされました

最初の test_token=hogehoge がブロックされて既に1分経っているので解除されていることも確認します。

for i in {1..10}; do echo -n "$(date '+%Y/%m/%d %H:%M:%S') ${i}回目:"; curl -s -b "test_token=hogehoge" "http://waf-test-alb-1801132515.ap-northeast-1.elb.amazonaws.com" -o /dev/null -w "%{http_code}\n"; sleep 0.5;done
2024/xx/xx 16:33:46 1回目:200
2024/xx/xx 16:33:47 2回目:200
2024/xx/xx 16:33:47 3回目:200
2024/xx/xx 16:33:48 4回目:200
2024/xx/xx 16:33:49 5回目:200
2024/xx/xx 16:33:49 6回目:200
2024/xx/xx 16:33:50 7回目:200
2024/xx/xx 16:33:50 8回目:200
2024/xx/xx 16:33:51 9回目:200
2024/xx/xx 16:33:52 10回目:200

解除されているようです。

まとめ

以下のドキュメントにあるようにCookieに特定のKeyが含まれる場合、Value単位でのブロックされるレートベースルールを作成しました。

https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/waf-rule-statement-type-rate-based-aggregation-options.html

Cookie – 名前付き Cookie を集約キーとして使用します。Cookie 内の個別の値はそれぞれ、集約インスタンスに影響します。

分散された複数のIPアドレスで連続アクセスしてくるBot等、IPではブロックできない場合で利用できそうですね。

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

この記事をシェアする

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.